#pragma once

#include <cstdint>
#include <iostream>
#include <string>
#include <vector>

#define MAXNUM 1024

namespace muduo
{
    class Buffer
    {
    public:
        /*
        存储数据的缓冲区：如果直接用string来接受，则\0默认为结束，但是在网络中\0有时候并不认为是结束符
        可读指针
        可写指针
        */
        std::vector<char> _buffer;
        uint64_t _read_index;
        uint64_t _write_index; 
    public:
        Buffer();
        // 获得缓冲区起始位置
        char* Begin();
        // 获取_buffer的大小
        uint64_t BufferSize();
        // 获得读位置指针
        char* GetReadIndex();
        // 获取写位置指针
        char* GetWriteIndex();
        // 获取读指针前的空闲空间
        uint64_t ReadFrontSpace();
        // 获取写指针后的空闲空间
        uint64_t WriteTailSpace();
        // 移动len个Read指针
        void MoveReadidx(uint64_t len);
        // 移动Write个Read指针
        void MoveWriteidx(uint64_t len);
        // 获取可读数据的大小
        uint64_t EnableReadSize();
        // 确保空间足够，如果不够则扩容
        void EnsureSpace(uint64_t len);
        // 读数据
        void Read(void* buff,uint64_t len);
        // 将缓冲区读取数据时需要更新读指针，这个函数用来写入并更新指针
        void ReadAndPop(void* buff,uint64_t len);
        std::string ReadAsString(uint64_t len);
        std::string ReadAsStringAndPop(uint64_t len);
        // 写数据
        void Write(const void* data,uint64_t len);
        // 将缓冲区写入数据时需要更新写指针，这个函数用来写入并更新指针 
        void WriteAndPush(const void* data,uint64_t len);
        void WriteAsString(const std::string& str);
        void WriteAsStringAndPush(const std::string& str);
        void WriteAsBuffer(Buffer& buf);
        void WriteAsBufferAndPush(Buffer& buf);
        std::string ReadAsString(const void* pos);
        char* FindCRLF();
        std::string GetLine();
        std::string GetLineAndPop();
        // 清空缓冲区
        void clear();

    };
}